// 爬虫运行脚本 - 一键启动爬虫
const { exec } = require('child_process');
const readline = require('readline');

// 创建一个读取用户输入的接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// 提示用户输入，返回Promise
function promptUser(question) {
  return new Promise((resolve) => {
    rl.question(question, (answer) => {
      resolve(answer);
    });
  });
}

// 运行命令并返回Promise
function runCommand(command) {
  return new Promise((resolve, reject) => {
    console.log(`正在执行: ${command}`);
    
    const childProcess = exec(command);
    
    // 将子进程的输出流传递到主进程
    childProcess.stdout.pipe(process.stdout);
    childProcess.stderr.pipe(process.stderr);
    
    childProcess.on('close', (code) => {
      if (code === 0) {
        resolve();
      } else {
        reject(new Error(`命令执行失败，退出码 ${code}`));
      }
    });
  });
}

// 主函数
async function main() {
  try {
    console.log('\n===== 模特图片爬虫工具 =====\n');
    
    // 询问模特名称
    const modelName = await promptUser('请输入模特名称(默认为安然): ');
    const finalModelName = modelName.trim() || '安然';
    
    console.log(`\n选择要执行的操作:`);
    console.log('1. 爬取图片集链接（第一步）');
    console.log('2. 爬取图片链接（第二步）');
    console.log('3. 下载图片（第三步）');
    console.log('4. 执行全部步骤');
    
    const operation = await promptUser('\n请选择操作(1-4): ');
    
    // 询问是否使用无头模式
    let isHeadless = true;
    if (operation === '1' || operation === '2' || operation === '4') {
      const headlessMode = await promptUser('是否使用无头模式(不显示浏览器)？(y/n，默认y): ');
      isHeadless = headlessMode.trim().toLowerCase() !== 'n';
    }
    
    // 根据用户选择执行相应操作
    switch (operation) {
      case '1':
        // 先设置环境变量，然后运行爬虫脚本
        process.env.MODEL_NAME = finalModelName;
        process.env.HEADLESS_MODE = isHeadless ? 'y' : 'n';
        await runCommand('node crawler.js');
        break;
        
      case '2':
        // 设置环境变量，运行图片链接下载器
        process.env.MODEL_NAME = finalModelName;
        process.env.HEADLESS_MODE = isHeadless ? 'y' : 'n';
        await runCommand('node image_downloader.js');
        break;
        
      case '3':
        // 询问要下载哪个图片集
        const imageSetOption = await promptUser('\n下载选项:\n1. 下载全部图片集\n2. 选择特定图片集\n请选择(1/2): ');
        
        if (imageSetOption === '2') {
          // 列出所有图片链接文件
          console.log(`\n正在查找 ${finalModelName}_图片链接 目录下的文件...`);
          const lsCommand = `ls -1 "${finalModelName}_图片链接/"`;
          
          exec(lsCommand, async (error, stdout, stderr) => {
            if (error) {
              console.error(`执行出错: ${error.message}`);
              rl.close();
              return;
            }
            
            if (stderr) {
              console.error(`stderr: ${stderr}`);
              rl.close();
              return;
            }
            
            const files = stdout.split('\n').filter(file => file.trim());
            
            if (files.length === 0) {
              console.log('没有找到图片链接文件，请先执行第二步');
              rl.close();
              return;
            }
            
            console.log('\n可选的图片集:');
            files.forEach((file, index) => {
              console.log(`${index + 1}. ${file}`);
            });
            
            const fileSelection = await promptUser('\n请输入要下载的图片集编号，多个编号用逗号分隔 (例如: 1,3,5): ');
            const selectedIndexes = fileSelection.split(',').map(s => parseInt(s.trim())).filter(n => !isNaN(n) && n > 0 && n <= files.length);
            
            if (selectedIndexes.length === 0) {
              console.log('没有选择有效的图片集，将退出程序');
              rl.close();
              return;
            }
            
            // 为每个选择的文件创建下载目录并下载图片
            for (const index of selectedIndexes) {
              const file = files[index - 1];
              const filePath = `${finalModelName}_图片链接/${file}`;
              const outputDir = file.replace('.txt', '');
              
              console.log(`\n正在下载 ${file} 中的图片到 ${outputDir} 目录...`);
              await runCommand(`python download_images.py "${filePath}" -d "${outputDir}"`);
            }
            
            console.log('\n所有下载任务完成！');
            rl.close();
          });
        } else {
          // 下载所有图片集
          console.log(`\n将下载 ${finalModelName}_图片链接 目录下的所有图片集...`);
          
          exec(`ls -1 "${finalModelName}_图片链接/"`, async (error, stdout, stderr) => {
            if (error) {
              console.error(`执行出错: ${error.message}`);
              rl.close();
              return;
            }
            
            const files = stdout.split('\n').filter(file => file.trim());
            
            if (files.length === 0) {
              console.log('没有找到图片链接文件，请先执行第二步');
              rl.close();
              return;
            }
            
            console.log(`找到 ${files.length} 个图片集文件`);
            
            for (const file of files) {
              const filePath = `${finalModelName}_图片链接/${file}`;
              const outputDir = file.replace('.txt', '');
              
              console.log(`\n正在下载 ${file} 中的图片到 ${outputDir} 目录...`);
              await runCommand(`python download_images.py "${filePath}" -d "${outputDir}"`);
            }
            
            console.log('\n所有下载任务完成！');
            rl.close();
          });
        }
        return; // 防止提前关闭rl
        
      case '4':
        // 执行全部步骤
        console.log('\n=== 开始执行全部步骤 ===');
        
        // 1. 爬取图片集链接
        process.env.MODEL_NAME = finalModelName;
        process.env.HEADLESS_MODE = isHeadless ? 'y' : 'n';
        console.log('\n第一步: 爬取图片集链接');
        await runCommand('node crawler.js');
        
        // 2. 爬取图片链接
        console.log('\n第二步: 爬取图片链接');
        await runCommand('node image_downloader.js');
        
        // 3. 下载图片
        console.log('\n第三步: 下载图片');
        exec(`ls -1 "${finalModelName}_图片链接/"`, async (error, stdout, stderr) => {
          if (error) {
            console.error(`执行出错: ${error.message}`);
            rl.close();
            return;
          }
          
          const files = stdout.split('\n').filter(file => file.trim());
          
          if (files.length === 0) {
            console.log('没有找到图片链接文件');
            rl.close();
            return;
          }
          
          for (const file of files) {
            const filePath = `${finalModelName}_图片链接/${file}`;
            const outputDir = file.replace('.txt', '');
            
            console.log(`\n正在下载 ${file} 中的图片到 ${outputDir} 目录...`);
            await runCommand(`python download_images.py "${filePath}" -d "${outputDir}"`);
          }
          
          console.log('\n所有步骤已完成！');
          rl.close();
        });
        return; // 防止提前关闭rl
        
      default:
        console.log('无效的选择，请重新运行程序');
    }
    
    rl.close();
  } catch (error) {
    console.error('执行错误:', error);
    rl.close();
  }
}

// 执行主函数
main().catch(console.error); 